import { ResultType, ResultUtil } from '@xtail/result'
import { DB } from '../classes'

/**
 * 保存文档到数据库
 *
 * @param {DB} db 数据库实例
 * @param {Record<string, any>} doc 要保存到数据库的文档
 * @returns {Promise<ResultType>} 保存结果
 */
export const save = async (db: DB, doc: Record<string, any>): Promise<ResultType> => {
  try {
    const res = await db.save(doc)
    return ResultUtil.genResult({
      status: res.ok,
      message: res.ok ? '保存成功' : '保存失败',
      data: res.ok ? { _id: res.id, _rev: res.rev, ...doc } : res
    })
  } catch (err: any) {
    return ResultUtil.genFailResult(err?.message ?? '保存失败', err)
  }
}

export type SaveType = typeof save

/**
 * 批量保存文档到数据库
 *
 * @param {DB} db 数据库实例
 * @param {Record<string, any>[]} docs 要保存到数据库的文档列表
 * @returns {Promise<ResultType>} 保存结果
 */
export const saveBatch = async (db: DB, docs: Record<string, any>[]): Promise<ResultType> => {
  try {
    const res = await db.saveBatch(docs)
    return ResultUtil.genResult({
      status: res.every(item => Reflect.get(item, 'ok')),
      message: res.every(item => Reflect.get(item, 'ok')) ? '保存成功' : '存在保存失败数据项',
      data: res
    })
  } catch (err: any) {
    return ResultUtil.genFailResult(err?.message ?? '保存失败', err)
  }
}

export type SaveBatchType = typeof saveBatch
